Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_rns_filesync_security.py

Displaying Raw • Download


tests/backend/test_rns_filesync_security.py 9f71f3420c18d5800afb493b723c328d23c7ea12 (9f71f342) Text, 10.09 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Adversarial and Hypothesis fuzz coverage for RNS FileSync handler."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787threading
Tff7b72from T7ee787types Tff7b72import Te6edf3SimpleNamespace
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch

Tff7b72import T7ee787pytest
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3HealthCheckTb4b4b4, Te6edf3givenTb4b4b4, Te6edf3settings
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3strategies Tff7b72as Te6edf3st

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rns_filesync_handler Tff7b72import Te6edf3RnsFilesyncHandler
Tff7b72from T7ee787rns_filesyncT7ee787.T7ee787paths Tff7b72import Te6edf3PathJailErrorTb4b4b4, Te6edf3normalize_relpath
Tff7b72from T7ee787rns_filesyncT7ee787.T7ee787permissions Tff7b72import Te6edf3PermissionStore

Te6edf3_TRAVERSAL_PAYLOADS Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ff../etc/passwdTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff..Tffea00\\Ta5d6ffwindowsTffea00\\Ta5d6ffsystem32Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffa/../../bTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/etc/passwdTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffC:Tffea00\\Ta5d6ffWindowsTffea00\\Ta5d6ffSystem32Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffaTffea00\x00Ta5d6ffbTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff//evilTa5d6ff"Tb4b4b4,
Ta5d6ff"Tffea00\\Tffea00\\Ta5d6ffevilTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffoo/../../../etc/shadowTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff.rns-filesync.dbTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdir/.rns-xfer-tempTa5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3_BAD_HASHES Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffzzTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnot-hexTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff../aabbTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffaTa5d6ff" Tff7b72* T79c0ff15Tb4b4b4,
Ta5d6ff"Ta5d6ffgTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4,
Ta5d6ff"Tffea00\x00Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Ta5d6ff"Ta5d6ff'Ta5d6ff OR Ta5d6ff'Ta5d6ff1Ta5d6ff'Ta5d6ff=Ta5d6ff'Ta5d6ff1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff../../identityTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffаTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4,
Tb4b4b4)


Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffhandlerTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3storage Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffidentity_aTa5d6ff"
Te6edf3storageTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3identity Tff7b72= Te6edf3SimpleNamespaceTb4b4b4(Tffa657hashTff7b72=Ta5d6ffbTa5d6ff"Tffea00\xaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Tff7b72return Te6edf3RnsFilesyncHandlerTb4b4b4(
Te6edf3reticulum_instanceTff7b72=Te6edf3MagicMockTb4b4b4(Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3identityTff7b72=Te6edf3identityTb4b4b4,
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3storageTb4b4b4)Tb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8fftest_path_traversal_payloads_rejected_by_normalizeTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3payload Tff7b72in Te6edf3_TRAVERSAL_PAYLOADSTb4b4b4:
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PathJailErrorTb4b4b4)Tb4b4b4:
Te6edf3normalize_relpathTb4b4b4(Te6edf3payloadTb4b4b4)


Tff7b72def Td2a8fftest_download_rejects_path_traversalTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3handlerTff7b72.Td2a8ffserviceTff7b72.Td2a8ffdownload_fileTff7b72.Td2a8ffside_effect Tff7b72= Tff7b72lambda Te6edf3peerTb4b4b4, Te6edf3pathTb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Ta5d6ffpath jail: Tffd700{Te6edf3pathTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72for Te6edf3payload Tff7b72in Te6edf3_TRAVERSAL_PAYLOADSTb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffdownload_fileTb4b4b4(Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6fferrorTa5d6ff" Tff7b72in Te6edf3result


Tff7b72def Td2a8fftest_download_and_browse_require_runningTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffdownload_fileTb4b4b4(Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffbrowse_peerTb4b4b4(Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffconnect_peerTb4b4b4(Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False


Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffparametrizeTb4b4b4(Ta5d6ff"Ta5d6ffbad_hashTa5d6ff"Tb4b4b4, Te6edf3_BAD_HASHESTb4b4b4)
Tff7b72def Td2a8fftest_connect_rejects_or_handles_bad_hashesTb4b4b4(Te6edf3handlerTb4b4b4, Te6edf3bad_hashTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3handlerTff7b72.Td2a8ffserviceTff7b72.Td2a8ffconnect_peerTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbad peerTa5d6ff"Tb4b4b4}
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffconnect_peerTb4b4b4(Te6edf3bad_hashTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657dictTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffokTa5d6ff" Tff7b72in Te6edf3result
Tff7b72if Tff7b72not Tffa657strTb4b4b4(Te6edf3bad_hashTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False


Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffparametrizeTb4b4b4(Ta5d6ff"Ta5d6ffbad_hashTa5d6ff"Tb4b4b4, Te6edf3_BAD_HASHESTb4b4b4)
Tff7b72def Td2a8fftest_acl_grant_handles_bad_hashesTb4b4b4(Te6edf3handlerTb4b4b4, Te6edf3bad_hashTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffupdate_aclTb4b4b4(
Te6edf3identity_hashTff7b72=Te6edf3bad_hashTb4b4b4,
Te6edf3permsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657dictTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffokTa5d6ff" Tff7b72in Te6edf3result


Tff7b72def Td2a8fftest_acl_enforce_denies_stranger_by_default_rulesTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Ta5d6ff"Ta5d6ffccTa5d6ff" Tff7b72* T79c0ff16
Te6edf3stranger Tff7b72= Ta5d6ff"Ta5d6ffddTa5d6ff" Tff7b72* T79c0ff16
Te6edf3handlerTff7b72.Td2a8ffupdate_aclTb4b4b4(Te6edf3identity_hashTff7b72=Te6edf3peerTb4b4b4, Te6edf3permsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3acl Tff7b72= Te6edf3handlerTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3aclTb4b4b4[Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Te6edf3perms Tff7b72= Te6edf3PermissionStoreTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3rule_permTb4b4b4, Te6edf3targets Tff7b72in Te6edf3aclTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3target Tff7b72in Te6edf3targetsTb4b4b4:
Te6edf3short Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdeleteTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdTa5d6ff"Tb4b4b4}Tb4b4b4[Te6edf3rule_permTb4b4b4]
Te6edf3permsTff7b72.Td2a8ffadd_ruleTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3shortTffd700}Ta5d6ff:Tffd700{Te6edf3targetTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3permsTff7b72.Td2a8ffcheckTb4b4b4(Te6edf3peerTb4b4b4, Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3permsTff7b72.Td2a8ffcheckTb4b4b4(Te6edf3strangerTb4b4b4, Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3permsTff7b72.Td2a8ffcheckTb4b4b4(Te6edf3strangerTb4b4b4, Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False


Tff7b72def Td2a8fftest_acl_rules_text_replace_does_not_leak_old_rulesTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3peer_a Tff7b72= Ta5d6ff"Ta5d6ff11Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3peer_b Tff7b72= Ta5d6ff"Ta5d6ff22Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3handlerTff7b72.Td2a8ffupdate_aclTb4b4b4(Te6edf3identity_hashTff7b72=Te6edf3peer_aTb4b4b4, Te6edf3permsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3handlerTff7b72.Td2a8ffupdate_aclTb4b4b4(
Te6edf3rules_textTff7b72=Ta5d6fffTa5d6ff"Ta5d6ffr:Tffd700{Te6edf3peer_bTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3replaceTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Te6edf3acl Tff7b72= Te6edf3handlerTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3peer_a Tff7b72not Tff7b72in Te6edf3aclTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3peer_b Tff7b72in Te6edf3aclTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3peer_a Tff7b72not Tff7b72in Te6edf3aclTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)


Tff7b72def Td2a8fftest_oversized_rules_text_does_not_raiseTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3huge Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffr:Ta5d6ff" Tff7b72+ Tb4b4b4(Ta5d6ff"Ta5d6ffabTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4) Tff7b72* T79c0ff5000
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffupdate_aclTb4b4b4(Te6edf3rules_textTff7b72=Te6edf3hugeTb4b4b4, Te6edf3replaceTff7b72=Tff7b72TrueTb4b4b4, Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tb4b4b4, Tffa657dictTb4b4b4)


Tff7b72def Td2a8fftest_teardown_clears_service_and_isolates_storageTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3storage_a Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffaTa5d6ff"
Te6edf3storage_b Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffbTa5d6ff"
Te6edf3storage_aTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3storage_bTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3identity_a Tff7b72= Te6edf3SimpleNamespaceTb4b4b4(Tffa657hashTff7b72=Ta5d6ffbTa5d6ff"Tffea00\xaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Te6edf3identity_b Tff7b72= Te6edf3SimpleNamespaceTb4b4b4(Tffa657hashTff7b72=Ta5d6ffbTa5d6ff"Tffea00\xbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Te6edf3ha Tff7b72= Te6edf3RnsFilesyncHandlerTb4b4b4(Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3identity_aTb4b4b4, Tffa657strTb4b4b4(Te6edf3storage_aTb4b4b4)Tb4b4b4)
Te6edf3hb Tff7b72= Te6edf3RnsFilesyncHandlerTb4b4b4(Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3identity_bTb4b4b4, Tffa657strTb4b4b4(Te6edf3storage_bTb4b4b4)Tb4b4b4)
Te6edf3peer Tff7b72= Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16
Te6edf3haTff7b72.Td2a8ffupdate_aclTb4b4b4(Te6edf3identity_hashTff7b72=Te6edf3peerTb4b4b4, Te6edf3permsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3hbTff7b72.Td2a8ffupdate_aclTb4b4b4(Te6edf3identity_hashTff7b72=Te6edf3peerTb4b4b4, Te6edf3permsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4)

Te6edf3svc Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3svcTff7b72.Td2a8ffget_statusTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}
Te6edf3haTff7b72.Td2a8ffservice Tff7b72= Te6edf3svc
Te6edf3haTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3haTff7b72.Td2a8ffservice Tff7b72is Tff7b72None
Te6edf3svcTff7b72.Td2a8ffstopTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)

Tff7b72assert Ta5d6ff"Ta5d6ffreadTa5d6ff" Tff7b72in Te6edf3haTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3peer Tff7b72in Te6edf3haTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4]
Tff7b72assert Ta5d6ff"Ta5d6ffwriteTa5d6ff" Tff7b72in Te6edf3hbTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3peer Tff7b72in Te6edf3hbTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3peer Tff7b72not Tff7b72in Te6edf3haTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72assert Tb4b4b4(Te6edf3storage_a Tff7b72/ Ta5d6ff"Ta5d6fffilesyncTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffacl.txtTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)
Tff7b72assert Tb4b4b4(Te6edf3storage_b Tff7b72/ Ta5d6ff"Ta5d6fffilesyncTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffacl.txtTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3storage_aTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4) Tff7b72!= Te6edf3storage_bTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_concurrent_acl_mutations_stableTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Ta5d6ff"Ta5d6ffffTa5d6ff" Tff7b72* T79c0ff16
Te6edf3errorsTb4b4b4: Tffa657listTb4b4b4[Tf85149BaseExceptionTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72def Td2a8ffworkerTb4b4b4(Te6edf3idxTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff40Tb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffupdate_aclTb4b4b4(
Te6edf3identity_hashTff7b72=Te6edf3peerTb4b4b4,
Te6edf3permsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4] Tff7b72if Tb4b4b4(Te6edf3idx Tff7b72+ Te6edf3iTb4b4b4) Tff7b72% T79c0ff2 Tff7b72== T79c0ff0 Tff7b72else Tb4b4b4[Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Te6edf3acl Tff7b72= Te6edf3handlerTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3aclTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tb4b4b4, Tffa657dictTb4b4b4)
Tff7b72assert Te6edf3aclTb4b4b4[Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72except Tf85149BaseException Tff7b72as Te6edf3excTb4b4b4:
Te6edf3errorsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3excTb4b4b4)

Te6edf3threads Tff7b72= Tb4b4b4[Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3workerTb4b4b4, Te6edf3argsTff7b72=Tb4b4b4(Te6edf3nTb4b4b4,Tb4b4b4)Tb4b4b4) Tff7b72for Te6edf3n Tff7b72in Tffa657rangeTb4b4b4(T79c0ff8Tb4b4b4)Tb4b4b4]
Tff7b72for Te6edf3t Tff7b72in Te6edf3threadsTb4b4b4:
Te6edf3tTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3t Tff7b72in Te6edf3threadsTb4b4b4:
Te6edf3tTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff10Tb4b4b4)
Tff7b72assert Tff7b72not Te6edf3errors
Te6edf3final Tff7b72= Te6edf3handlerTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3finalTb4b4b4[Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True


Tf0883e@settingsTb4b4b4(
Te6edf3max_examplesTff7b72=T79c0ff40Tb4b4b4,
Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fftoo_slowTb4b4b4, Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3pathTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(
Te6edf3alphabetTff7b72=Te6edf3stTff7b72.Td2a8ffcharactersTb4b4b4(
Te6edf3whitelist_categoriesTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ffLTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffNTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffPTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffSTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffZTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCcTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4,
Te6edf3max_sizeTff7b72=T79c0ff400Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_download_path_fuzz_never_raisesTb4b4b4(Te6edf3handlerTb4b4b4, Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3handlerTff7b72.Td2a8ffserviceTff7b72.Td2a8ffdownload_fileTff7b72.Td2a8ffside_effect Tff7b72= Tff7b72lambda Te6edf3peerTb4b4b4, Te6edf3pTb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdeniedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3pTb4b4b4,
Tb4b4b4}
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffdownload_fileTb4b4b4(Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Te6edf3pathTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657dictTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffokTa5d6ff" Tff7b72in Te6edf3result


Tf0883e@settingsTb4b4b4(
Te6edf3max_examplesTff7b72=T79c0ff40Tb4b4b4,
Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fftoo_slowTb4b4b4, Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3identity_hashTff7b72=Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(
Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff80Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff40Tb4b4b4)Tff7b72.Td2a8ffmapTb4b4b4(Tff7b72lambda Te6edf3bTb4b4b4: Te6edf3bTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8ffsampled_fromTb4b4b4(Tffa657listTb4b4b4(Te6edf3_BAD_HASHESTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3permsTff7b72=Te6edf3stTff7b72.Td2a8fflistsTb4b4b4(
Te6edf3stTff7b72.Td2a8ffsampled_fromTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdeleteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffadminTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnopeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Te6edf3max_sizeTff7b72=T79c0ff6Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3enforceTff7b72=Te6edf3stTff7b72.Td2a8ffbooleansTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rules_textTff7b72=Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(Te6edf3stTff7b72.Td2a8ffnoneTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3max_sizeTff7b72=T79c0ff500Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3replaceTff7b72=Te6edf3stTff7b72.Td2a8ffbooleansTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_acl_update_fuzz_never_raisesTb4b4b4(
Te6edf3handlerTb4b4b4,
Te6edf3identity_hashTb4b4b4,
Te6edf3permsTb4b4b4,
Te6edf3enforceTb4b4b4,
Te6edf3rules_textTb4b4b4,
Te6edf3replaceTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffupdate_aclTb4b4b4(
Te6edf3identity_hashTff7b72=Te6edf3identity_hashTb4b4b4,
Te6edf3permsTff7b72=Te6edf3permsTb4b4b4,
Te6edf3enforceTff7b72=Te6edf3enforceTb4b4b4,
Te6edf3rules_textTff7b72=Te6edf3rules_textTb4b4b4,
Te6edf3replaceTff7b72=Te6edf3replaceTb4b4b4,
Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657dictTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffokTa5d6ff" Tff7b72in Te6edf3result


Tf0883e@settingsTb4b4b4(
Te6edf3max_examplesTff7b72=T79c0ff30Tb4b4b4,
Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fftoo_slowTb4b4b4, Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3sync_directoryTff7b72=Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(
Te6edf3stTff7b72.Td2a8ffnoneTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff200Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8ffsampled_fromTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff../escapeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/tmp/xTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff~/.sshTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3monitorTff7b72=Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(Te6edf3stTff7b72.Td2a8ffnoneTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffbooleansTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3announce_intervalTff7b72=Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(
Te6edf3stTff7b72.Td2a8ffnoneTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8ffintegersTb4b4b4(Te6edf3min_valueTff7b72=Tff7b72-T79c0ff10Tb4b4b4, Te6edf3max_valueTff7b72=T79c0ff10_000Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3max_sizeTff7b72=T79c0ff20Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_settings_fuzz_never_raisesTb4b4b4(Te6edf3handlerTb4b4b4, Te6edf3sync_directoryTb4b4b4, Te6edf3monitorTb4b4b4, Te6edf3announce_intervalTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffupdate_settingsTb4b4b4(
Te6edf3sync_directoryTff7b72=Te6edf3sync_directoryTb4b4b4,
Te6edf3monitorTff7b72=Te6edf3monitorTb4b4b4,
Te6edf3announce_intervalTff7b72=Te6edf3announce_intervalTb4b4b4,
Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657dictTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffokTa5d6ff" Tff7b72in Te6edf3result


Tf0883e@settingsTb4b4b4(
Te6edf3max_examplesTff7b72=T79c0ff25Tb4b4b4,
Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fftoo_slowTb4b4b4, Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3peer_idTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff100Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_disconnect_fuzz_never_raisesTb4b4b4(Te6edf3handlerTb4b4b4, Te6edf3peer_idTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffdisconnect_peerTb4b4b4(Te6edf3peer_idTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657dictTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffokTa5d6ff" Tff7b72in Te6edf3result


Tf0883e@patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.rns_filesync_handler.FileSyncServiceTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_start_with_malicious_interval_rejectedTb4b4b4(Te6edf3mock_service_clsTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffstartTb4b4b4(Te6edf3announce_intervalTff7b72=T79c0ff1Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Te6edf3mock_service_clsTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)


Tf0883e@patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.rns_filesync_handler.FileSyncServiceTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_start_wires_callbacks_and_reuses_host_reticulumTb4b4b4(Te6edf3mock_service_clsTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3service Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3serviceTff7b72.Td2a8ffstartTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffabTa5d6ff" Tff7b72* T79c0ff16
Te6edf3serviceTff7b72.Td2a8ffget_statusTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4: Te6edf3handlerTff7b72.Td2a8ff_sync_directoryTb4b4b4,
Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffabTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffwhitelistTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Tb4b4b4}
Te6edf3mock_service_clsTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3service
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3mock_service_clsTff7b72.Td2a8ffcall_argsTff7b72.Td2a8ffkwargsTb4b4b4[Ta5d6ff"Ta5d6ffown_reticulumTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3serviceTff7b72.Td2a8ffon_error Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3serviceTff7b72.Td2a8ffon_sync_progress Tff7b72is Tff7b72not Tff7b72None


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────